package com.dongdong.aop;


import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

//AOP是一项面向切面的编程技术
//AOP的五大核心： 返回通知  前置通知   后置通知   环绕通知   异常通知
@Aspect     //面向切面的注解
@Component   //程序启动时放到IOC容器当中      Spring的核心就是AOP和IOC
@Slf4j
public class AopLog {

                        //*表示返回值             所有service* 下的所有
    @Pointcut("execution(public * com.dongdong.service.*.*(..)) ||@annotation(com.dongdong.aop.AnLog)")//要切面的路径
    public void log(){                                          //加上这个注解之后controller也可以通过这个注解去使用
    }


    @Before("log()")//前置通知
    public void before(JoinPoint joinPoint){//注意这个方法不要导错包了
        Object[] args = joinPoint.getArgs();//参数
        Signature signature = joinPoint.getSignature();//方法
        log.info("方法名为:{},参数为:{}",signature,args);
    }

    @AfterReturning(value = "log()",returning = "result")//返回通知
    public void afterun(Object result){
        log.info("返回值为:{}", JSONObject.toJSONString(result));//由于返回的数据可能是任何类型 如果时对象打印的就是地址，所以直接在这里转换即可
    }
}
